'use strict'

Object.defineProperty(exports, '__esModule', {
  value: true
})
exports.default = wrapperRaf

var raf = function raf(callback) {
  return +setTimeout(callback, 16)
}

var caf = function caf(num) {
  return clearTimeout(num)
}

if (typeof window !== 'undefined' && 'requestAnimationFrame' in window) {
  raf = function raf(callback) {
    return window.requestAnimationFrame(callback)
  }

  caf = function caf(handle) {
    return window.cancelAnimationFrame(handle)
  }
}

var rafUUID = 0
var rafIds = new Map()

function cleanup(id) {
  rafIds.delete(id)
}

function wrapperRaf(callback) {
  var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1
  rafUUID += 1
  var id = rafUUID

  function callRef(leftTimes) {
    if (leftTimes === 0) {
      // Clean up
      cleanup(id) // Trigger

      callback()
    } else {
      // Next raf
      var realId = raf(function() {
        callRef(leftTimes - 1)
      }) // Bind real raf id

      rafIds.set(id, realId)
    }
  }

  callRef(times)
  return id
}

wrapperRaf.cancel = function(id) {
  var realId = rafIds.get(id)
  cleanup(realId)
  return caf(realId)
}
